package agh.rozproszony.DBStorage;

import View.InvitationRow;
import agh.rozproszony.model.Message;
import agh.rozproszony.model.Reservation;
import agh.rozproszony.model.Room;
import agh.rozproszony.model.User;
import agh.rozproszony.model.Invitation;
import java.rmi.RemoteException;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public interface DataBaseEngine {

    /**
     * Usuwa wszystkie dane z bazy danych
     *
     * @throws SQLException
     */
    public void clearDatabase() throws SQLException;

    /**
     * @param id
     * @return User
     * @throws SQLException
     */
    public User getUser(int id) throws SQLException;

    /**
     * @param roomid
     * @return Room
     * @throws SQLException
     */
    public Room getRoom(int roomId) throws SQLException;

    /**
     * @param id
     * @return Reservation
     * @throws SQLException
     */
    public Reservation getReservation(int id) throws SQLException;

    /**
     * @param id
     * @return Message
     * @throws SQLException
     */
    public Message getMessage(int id) throws SQLException;

    /**
     * @param id
     * @return Invitation
     * @throws SQLException
     */
    public Invitation getInvitation(int id) throws SQLException;

    /**
     * @param login
     * @return User
     * @throws SQLException
     */
    public User getUserByEmail(String email) throws SQLException;

    /**
     * @param email
     * @return user
     * @throws SQLException
     */
    public void changePassword(User user, String newPassword) throws SQLException;

    /**
     * @param name
     * @return void
     * @throws SQLException
     */
    public int getUserTypeByName(String name) throws SQLException;

    /**
     * @param name
     * @return User Type
     * @throws SQLException
     */
    public int getUserTypeByID(int id) throws SQLException;

    /**
     * @param userID
     * @return User Type
     * @throws SQLException
     */
    public Message getMessage(String title) throws SQLException;

    /**
     * @param title
     * @return Message
     * @throws SQLException
     */
    public ArrayList<Message> getMessages(int id) throws SQLException;

    /**
     * @param userId
     * @return ArrayList<Message>
     * @throws SQLException
     */
    public ArrayList<Message> getNotReadedMessages(int userId) throws SQLException;

    /**
     * @param int roomId,int day, int month, int year
     * @return ArrayList<Message>
     * @throws SQLException
     */
    public List<Reservation> getRoomReservations(int roomId, int day, int month, int year) throws SQLException;

    public void insertUser(User user) throws SQLException;

    /**
     * @param user
     * @return void
     * @throws SQLException
     */
    public void insertMessage(Message message) throws SQLException;

    /**
     * @param message
     * @return void
     * @throws SQLException
     */
    public void insertReservation(Reservation reservation) throws SQLException;

    /**
     * @param reservation
     * @return void
     * @throws SQLException
     */
    public void insertRoom(Room room) throws SQLException;

    /**
     * Dodaje pokój do bazy
     *
     * @return void
     * @throws SQLException
     */
    public List<Room> getAllRooms() throws SQLException;

    /**
     * Zwraca wszsytkie pokoje w systemie
     *
     * @return List<Room>
     * @throws SQLException
     */
    public List<User> getAllUsers() throws SQLException;

    /**
     * Zwraca wszystkich użytkowników w systemie
     *
     * @return
     * @throws SQLException
     */
    public List<Reservation> getAllReservations() throws SQLException;

    /**
     * Zwraca true, jezeli dana rezerwacja moze zostac dodana (sala nie jest
     * zajeta w tym czasie przez kogos innego)
     *
     * @param reservation Proponowana rezerwacja
     * @return
     */
    public boolean isReservationPossible(Reservation reservation);

    /**
     * Zwraca użytkownika po loginie
     *
     * @param login
     * @return User
     * @throw SQLException
     */
    public User getUserByLogin(String login) throws SQLException;

    public void insertInvitiation(Invitation invitation) throws SQLException;

    /**
     * Zwraca zaproszenia skierowane do danego uzytkownika, oczekujace na
     * akceptacje
     *
     * @param userId Uzytkownik, do ktrego skierowane sa zaproszenia
     * @return
     * @throws SQLException
     */
    public List<Invitation> getAwaitingInvitations(int userId) throws SQLException;

    /*
     * Zwraca nazwe pokoju który została zarezerowany
     * @param id
     * @return String
     */
    public String getReservationRoomName(int id) throws RemoteException, SQLException;

    /*
     * Zwraca nazwe użytkownika który dokonał rezerwacji pokoju
     * @param id
     * @return String
     */
    public String getReservationOwnerLogin(int id) throws RemoteException, SQLException;

    /**
     * Usuwa podana rezerwacje
     *
     * @param reservation
     */
    public void deleteReservation(Reservation reservation) throws SQLException;

    /**
     * Usuwa podanego uzytkownika
     *
     * @param user
     */
    public void deleteUser(User user) throws SQLException;

    /**
     * Usuwa podane pomieszczenie
     *
     * @param room
     */
    public void deleteRoom(Room room) throws SQLException;

    /*
     * Zwraca liste rezerwacji z przedziału dat od do
     * @param from
     * @param to
     * @return List<Reservation>
     */
    public List<Reservation> getAllReservations(java.util.Date from, java.util.Date to) throws SQLException;

    /*
     * Zwraca liste rezerwacji z przedziału dat od do
     * @param from
     * @param to
     * @param roomId
     * @return List<Reservation>
     */
    public List<Reservation> getAllReservations(java.util.Date from, java.util.Date to, int roomId) throws SQLException;

    /*
     * Zwraca Id rezerwacji z bazy danych
     * @param reservation
     * @return id
     */
    public int getReservationId(Reservation reservation) throws SQLException;


    public int deleteInvitation(InvitationRow removeUnselectedRows) throws SQLException;
    
    public void setInvitationAccepted( int userId, int reservationId ) throws SQLException;
}
